package com.example.juc;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.IntUnaryOperator;

/**
 * @Description
 * @Date 2021/7/24
 * @Created by Jonathan
 */

@Slf4j
public class AtomicIntegerDemo {
    public static void main(String[] args) {
        AtomicInteger integer = new AtomicInteger(10);
        int updateAndGet = integer.updateAndGet(x -> x * x);
        log.info("updateAndGet:{}", updateAndGet);

        // 自己对上面的实现
        while (true) {
            int pre = integer.get();
            int data = pre * pre;
            if (integer.compareAndSet(pre, data)) {
                break;
            }
        }
        // 改造成lambda表达式
        log.info("updateAndGet:{}", integer.get());

        updateAndGet(integer, x -> x / 2);
        log.info("updateAndGet:{}", integer.get());

    }

    public static void updateAndGet(AtomicInteger integer, IntUnaryOperator operator) {
        // 自己对上面的实现
        while (true) {
            int pre = integer.get();
            // 这个计算方法 传进来
            int data = operator.applyAsInt(pre);
            if (integer.compareAndSet(pre, data)) {
                break;
            }
        }
    }
}
